package com.xuecheng.content.service.impl;

import com.xuecheng.content.mapper.CourseCategoryMapper;
import com.xuecheng.content.model.dto.CourseCategoryTreeDto;
import com.xuecheng.content.service.CourseCategoryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 由于 Java 中对象是引用类型，mapTemp、courseCategoryTreeDtos 和 courseCategoryTreeList 中的节点对象本质上是同一批对象的引用。
 * 当通过 courseCategoryParent.getChildrenTreeNodes().add(item) 修改父节点的子列表时，实际上是在修改 courseCategoryTreeList
 * 中某个一级节点的子节点列表。因为它们共享同一内存地址，操作 courseCategoryParent 会直接影响 courseCategoryTreeList 中的节点结构。
 */
@Service
public class CourseCategoryServiceImpl implements CourseCategoryService {
    @Autowired
    CourseCategoryMapper courseCategoryMapper;
    @Override
    public List<CourseCategoryTreeDto> queryTreeNodes(String id) {
        //调用mapper递归查询查询出分类信息
        List<CourseCategoryTreeDto> courseCategoryTreeDtos = courseCategoryMapper.selectTreeNodes(id);

        //找到每个节点的子节点，最终封装成List<CourseCategoryTreeDto>
        //先将list转map，key就是结点的id，value就是CourseCategoryTreeDto对象，为了方便从map获取结点
        Map<String, CourseCategoryTreeDto> mapTemp = courseCategoryTreeDtos.stream().filter(item->!id.equals(item.getId())).collect(Collectors.toMap(key -> key.getId(), value -> value, (key1, key2) -> key2));
        //定义一个List作为最终返回的list
        List<CourseCategoryTreeDto> courseCategoryTreeList = new ArrayList<>();
        //从头遍历List<CourseCategoryTreeDto>,一边遍历一边找子节点放在父节点的childrenTreeNodes中
        courseCategoryTreeDtos.stream().filter(item->!id.equals(item.getId())).forEach(item->{
            //向list写写入元素
            if(item.getParentid().equals(id)){
                courseCategoryTreeList.add(item);
            }
            //找到节点的父节点
            CourseCategoryTreeDto courseCategoryParent = mapTemp.get(item.getParentid());
            if(courseCategoryParent!=null){
                if(courseCategoryParent.getChildrenTreeNodes()==null){
                    //如果该父节点的子节点属性为空，要new
                    courseCategoryParent.setChildrenTreeNodes(new ArrayList<>());
                }
                //找到每个节点的子节点放在父节点的childrenTreeNodes属性中
                courseCategoryParent.getChildrenTreeNodes().add(item);
            }

        });
        return courseCategoryTreeList;
    }
}
